Observer Design Pattern হল একটি আচরণগত ডিজাইন প্যাটার্ন যা একাধিক অবজার্ভার (subscriber) কে একটি বিষয় (subject) এর পরিবর্তন সম্পর্কে অবহিত করতে ব্যবহৃত হয়। এটি ইভেন্ট হ্যান্ডলিং বা ডাটা আপডেটের ক্ষেত্রে খুবই কার্যকর, বিশেষত যখন একাধিক অবজার্ভার থাকে যারা একত্রে একটি বিষয় (subject) এর অবস্থা পরিবর্তনের উপর নজর রাখে।
নিচে Observer Pattern ব্যবহার করে ইভেন্ট হ্যান্ডলিংয়ের একটি উদাহরণ দেওয়া হয়েছে যেখানে একটি Subject ক্লাস তার অবজার্ভারদের খবর দেয় যখন তার স্টেট পরিবর্তন হয়।
উদাহরণ:
import java.util.ArrayList;
import java.util.List;
// Observer Interface
interface Observer {
void update(String message);
}
// Concrete Observer - এটি Observer Interface ইমপ্লিমেন্ট করে
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
// Subject (Publisher) Interface
interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// Concrete Subject - এটি Subject Interface ইমপ্লিমেন্ট করে
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
public void setState(String state) {
this.state = state;
notifyObservers();
}
public String getState() {
return state;
}
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
}
// Main Class to demonstrate Observer Pattern
public class ObserverPatternExample {
public static void main(String[] args) {
// ConcreteSubject তৈরি
ConcreteSubject subject = new ConcreteSubject();
// ConcreteObservers তৈরি
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
Observer observer3 = new ConcreteObserver("Observer 3");
// Observer গুলো সাবস্ক্রাইব করে Subject এ
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.addObserver(observer3);
// Subject এর state পরিবর্তন করলে সকল Observerদের খবর দেওয়া হবে
System.out.println("State change 1: ");
subject.setState("New State: 1");
// Observer 1 কে সরিয়ে দেয়া
subject.removeObserver(observer1);
// আবার state change
System.out.println("\nState change 2: ");
subject.setState("New State: 2");
}
}
Explanation:
- Observer Interface: এটি একটি সাধারণ ইন্টারফেস যা সমস্ত অবজার্ভার ক্লাস দ্বারা ইমপ্লিমেন্ট করতে হবে। এটি
update()মেথডের মাধ্যমে অবজার্ভারদের অবহিত করবে। - ConcreteObserver Class: এই ক্লাসটি
Observerইন্টারফেস ইমপ্লিমেন্ট করে এবংupdate()মেথডের মাধ্যমে একটি বার্তা গ্রহণ করে তা প্রদর্শন করে। - Subject Interface: এটি একটি ইন্টারফেস যা
addObserver(),removeObserver(), এবংnotifyObservers()মেথড প্রদান করে। এটি অবজার্ভারদের যুক্ত করার, তাদের সরিয়ে দেওয়ার, এবং তাদের সবকে অবহিত করার কাজ করে। - ConcreteSubject Class: এটি
Subjectইন্টারফেস ইমপ্লিমেন্ট করে এবং তারstateএর পরিবর্তন ঘটানোর সাথে সাথে অবজার্ভারদের অবহিত করে।setState()মেথডের মাধ্যমে স্টেট পরিবর্তন করা হয় এবংnotifyObservers()এর মাধ্যমে সকল অবজার্ভারকে অবহিত করা হয়। - Main Class:
ObserverPatternExampleক্লাসে একটিConcreteSubjectএবং তিনটিConcreteObserverতৈরি করা হয়। আমরা প্রথমে সকল অবজার্ভারকে সাবস্ক্রাইব করে দিয়ে স্টেট পরিবর্তন ঘটাই, পরে একটি অবজার্ভার সরিয়ে দিয়ে আবার স্টেট পরিবর্তন করি।
Output Example:
State change 1:
Observer 1 received message: New State: 1
Observer 2 received message: New State: 1
Observer 3 received message: New State: 1
State change 2:
Observer 2 received message: New State: 2
Observer 3 received message: New State: 2
Key Points:
- Observer Pattern এ,
Subjectএর স্টেট পরিবর্তন হলে, সকল অবজার্ভারদের অবহিত করা হয়। - এই প্যাটার্নটি ইভেন্ট হ্যান্ডলিং এবং ডাটা আপডেটিংয়ে ব্যবহার করা হয় যেখানে একাধিক অবজার্ভার একই বিষয়টির উপর নজর রাখে।
- আপনি অবজার্ভারগুলোকে
addObserver()এবংremoveObserver()মেথডের মাধ্যমে সহজেই যুক্ত বা সরিয়ে ফেলতে পারেন। - এটি loose coupling (অল্প সম্পর্কিত) ডিজাইন তৈরি করে, যেখানে অবজার্ভার এবং সাবজেক্ট একে অপরের প্রতি খুব নির্ভরশীল নয়।
এটি মূলত GUI অ্যাপ্লিকেশন, ইভেন্ট হ্যান্ডলিং, এবং ডাটা মডেল আপডেটের জন্য ব্যবহৃত হয়।
Content added By
Read more
Singleton Design Pattern Example: Singleton Class তৈরি এবং ব্যবহার
Factory Design Pattern Example: Object Creation এর জন্য Factory Design Pattern ব্যবহার
Decorator Design Pattern Example: Dynamic Object Modification এর জন্য Decorator Pattern
Strategy Design Pattern Example: Algorithm নির্বাচন এর জন্য Strategy Pattern